package basis.idnr;

import java.io.Serializable;


/**
 * Die Klasse ISBN bietet die Moeglichkeit ISBN-Nummern standardkonform
 * abzuspeichern und auszugeben.
 * 
 * Datei: ISBN.java                   
 * Datum: 19.11.2011   
 *                  
 * @author Alexander Bredo 
 * @version 0.2
 */
public class ISBN implements Serializable
{
  private static final long serialVersionUID = -5878729172939760384L;
  private Identifikationsnummer idnr;
  

  /**
   * Erstellt ein ISBN-Objekt aus einer Zeichenfolge. 
   * Sowohl ISBN10 und ISBN13 sind moeglich.
   */
  public ISBN (String isbn) throws IllegalArgumentException
  {
    setzeISBN (isbn);
  }


  /**
   * Erstellt ein ISBN-Objekt aus einer Zahl. 
   * Sowohl ISBN10 und ISBN13 sind moeglich.
   */
  public ISBN (long isbn) throws IllegalArgumentException
  {
    setzeISBN (isbn);
  }


  /**
   * Gibt die ISBN als long zurueck
   */
  public long toLong ()
  {
    return idnr.toLong ();
  }


  /**
   * Gibt die ISBN als Zeichenkette zurueck
   */
  public String toString ()
  {
    return idnr.toString ();
  }


  /**
   * Prueft eine ISBN auf ihre Gueltigkeit (Laenge und Pruefziffer)
   */
  public static boolean istGueltig (String isbn)
  {
    Identifikationsnummer tmpidnr = null;
    
    try
    {
      tmpidnr = gibISBNObjekt (isbn);
    }
    catch (IllegalArgumentException e)
    {
      /* Kein Fehler, sondern Pruefung durch Erstellung des Objektes  */
    }

    return tmpidnr != null;
  }


  /**
   * Prueft eine ISBN auf Gleichheit (auch ISBN10 und ISBN13 sind 
   * miteinander moeglich)
   */
  public boolean istIdentisch (ISBN isbn)
  {
    return isbn.gibISBN13 ().toLong () == gibISBN13 ().toLong ();
  }

  
  /**
   * Setzt die ISBN als Zeichenfolge
   * @param isbn
   */
  public void setzeISBN (String isbn) throws IllegalArgumentException
  {
    idnr = gibISBNObjekt (isbn);
  }
  
  
  /**
   * Setzt die ISBN als Zahl
   * @param isbn
   */
  public void setzeISBN (long isbn) throws IllegalArgumentException
  {
    idnr = gibISBNObjekt (isbn);
  }
  
  
  /**
   * Gibt ein ISBN10 oder ISBN13 Objekt zurueck
   */
  private static Identifikationsnummer gibISBNObjekt (long isbn) 
      throws IllegalArgumentException
  {
    Identifikationsnummer tmpidnr = null;
    
    try
    {
      tmpidnr = new ISBN13 (isbn);
    }
    catch (IllegalArgumentException e)
    {
      /* Kein Fehler, sondern Pruefung durch Erstellung des Objektes  */
    }
    try
    {
      tmpidnr = new ISBN10 (isbn);
    }
    catch (IllegalArgumentException e)
    {
      /* Kein Fehler, sondern Pruefung durch Erstellung des Objektes  */
    }
    if (tmpidnr == null)
    {
      throw new IllegalArgumentException (
          "Fehlerhafte ISBN oder ungueltige Pruefziffer.");
    }
    else
    {
      return tmpidnr;
    }
  }
  
  
  /**
   * Gibt ein ISBN10 oder ISBN13 Objekt zurueck
   */
  private static Identifikationsnummer gibISBNObjekt (String isbn) 
      throws IllegalArgumentException
  {
    return gibISBNObjekt (Identifikationsnummer.gibZahl (isbn));
  }

  
  /**
   * Gibt immer eine ISBN13 zurueck, auch wenn die Eingabe als 
   * ISBN10 vorgenommen wurde
   */
  public ISBN13 gibISBN13 ()
  {
    if (idnr instanceof ISBN13)
    {
      return (ISBN13) idnr;
    }
    if (idnr instanceof ISBN10)
    {
      return ISBN13.konvertiereISBN10in13 ((ISBN10) idnr);
    }
    return null;                        /* darf nie eintreten         */
  }
  
}
